"""
高级特性
"""

# ---------切片
list1 = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
print(list1[0:3])
print(list1[:3])
print(list1[1:3])
print(list1[-2:])

list2 = list(range(20))
print(list2)
print(list2[:10])
print(list2[:10:2])

str1 = 'abcdefg'
print(str1[:5])
print(str1[::2])


# --------迭代
d1 = {'a': 1, 'b': 2, 'c': 3}
for key in d1:
    print(key)

for k, v in d1.items():
    print(k, v)

for s in str1:
    print(s)


# ---------列表生成式
list3 = [x * x for x in range(1, 11)]
print(list3)

list4 = [k+'='+str(v) for k, v in d1.items()]
print(list4)

list5 = [x for x in range(1, 11) if x % 2 == 0]
print(list5)

# ---------生成器
# 方式一：使用()。()定义的是生成器，不是元组。生成器保存的算法，而不是数据。
gen1 = (x * x for x in range(1, 11))
for g in gen1:
    print(g)

# 方式二：使用yield语句。注意yield语句，生成器函数必须包含yield语句，yield语句是生成器函数的关键字，用来返回一个值，并且保存函数的状态。在执行过程中，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。
def triangles():
    L = [1]
    while True:
        yield L
        L = [1] + [L[i] + L[i+1] for i in range(len(L)-1)] + [1]


for t in triangles():
    print(t)
    if len(t) > 10:
        break

# ---------迭代器
# 判断是否Iterable对象：可以使用isinstance()函数判断。如果是可以使用for循环遍历。
from collections.abc import Iterable
print(isinstance(list3, Iterable))
for i in list3:
    print(i)

# 判断是否Iterator对象
from collections.abc import Iterator
print(isinstance(list3, Iterator))
# 转换成Iterator对象，使用iter()函数，然后可以使用next()函数获取下一个元素。
list32 = iter(list3)
print(next(list32))
